#define _CRT_SECURE_NO_WARNINGS 1
#include "Data.h"

//1.日期加整数(原日期改变)
Data& Data::operator+=(int day)
{
	_day += day;

	while (_day > GetMonthDay(_year, _month))
	{
		_day -= GetMonthDay(_year, _month);
		_month += 1;
		if (_month == 13)
		{
			_year += 1;
			_month = 1;
		}
	}
	return *this;
}

//2.日期加整数(原日期不变)
Data Data::operator+(int day)
{
	Data tmp = *this;
	tmp += day;

	//while(tmp._day > tmp.GetMonthDay(tmp._year, tmp._month))
	//{
	//	tmp._day -= tmp.GetMonthDay(tmp._year, tmp._month);
	//	tmp._month += 1;
	//	if (tmp._month == 13)
	//	{
	//		tmp._year += 1;
	//		tmp._month = 1;
	//	}
	//}
	return tmp;
}

//3.日期减整数(原日期改变)
Data& Data::operator-=(int day)
{
	_day -= day;
	while (_day < 1)
	{
		_month -= 1;
		if (_month == 0)
		{
			_year -= 1;
			_month = 12;
		}
		_day += GetMonthDay(_year, _month);
	}
	return *this;
}

//4.日期减整数(原日期不变)
Data Data::operator-(int day)
{
	Data tmp = *this;
	tmp -= day;

	return tmp;
}

//5.日期减日期
int operator-(const Data& d1, const Data& d2)
{
	//假设法，max存大日期，min存小日期
	Data max = d2;
	Data min = d1;
	int flag = 1;

	if (max < min)
	{
		max = d1;
		min = d2;
		flag = -1;
	}
	int ret = 0;
	while (min < max)
	{
		min++;
		ret++;
	}
	return ret*flag;
}

//6.日期比较
bool operator>(const Data& d1, const Data& d2)
{
	//if (d1._year > d2._year)
	//{
	//	return true;
	//}
	//else if(d1._year == d2._year)
	//{
	//	if (d1._month > d2._month)
	//	{
	//		return true;
	//	}
	//	else if(d1._month == d2._month)
	//	{
	//		if (d1._day > d2._day)
	//		{
	//			return true;
	//		}
	//		else
	//		{
	//			return false;
	//		}
	//	}
	//	else
	//	{
	//		//d1._month<d2._month
	//		return false;
	//	}
	//}
	//else
	//{
	//	//d1._year<d2._year
	//	return false;
	//}

	if (d1._year > d2._year)
	{
		return true;
	}
	else if (d1._year == d2._year)
	{
		if (d1._month > d2._month)
		{
			return true;
		}
		else if (d1._month == d2._month)
		{
			if (d1._day > d2._day)
			{
				return true;
			}
		}
	}
	return false;
}

bool operator>=(const Data& d1, const Data& d2)
{
	//if (d1 > d2 || d1 == d2)
	//{
	//	return true;
	//}
	//else
	//{
	//	return false;
	//}

	return (d1 > d2 || d1 == d2);
}

bool operator<(const Data& d1, const Data& d2)
{
	//if (d1._year < d2._year)
	//{
	//	return true;
	//}
	//else if (d1._year > d2._year)
	//{
	//	return false;
	//}
	//else
	//{
	//	//d1._year == d2._year，比较月
	//	if (d1._month < d2._month)
	//	{
	//		return true;
	//	}
	//	else if (d1._month > d2._month)
	//	{
	//		return false;
	//	}
	//	else
	//	{
	//		//d1._month == d2._month，比较天
	//		if (d1._day < d2._day)
	//		{
	//			return true;
	//		}
	//		else
	//		{
	//			return false;
	//		}
	//	}
	//}

	//小于其实就是大于等于的取反
	return !(d1 >= d2);
}

bool operator<=(const Data& d1, const Data& d2)
{
	//if (d1 < d2 || d1 == d2)
	//{
	//	return true;
	//}
	//return false;

	//小于等于就是大于的取反
	return !(d1 > d2);
}

bool operator==(const Data& d1, const Data& d2)
{
	if (d1._year == d2._year
		&& d1._month == d2._month
		&& d1._day == d2._day)
	{
		return true;
	}
	return false;
}

//7.日期自增
//d++
Data Data::operator++(int)
{
	Data tmp = *this;
	*this += 1;
	return tmp;
}

//++d
Data& Data::operator++()
{
	return (*this += 1);
}

//8.日期自减
//d--
Data Data::operator--(int)
{
	Data tmp = *this;
	*this -= 1;
	return tmp;
}

//--d
Data& Data::operator--()
{
	return (*this -= 1);
}

//9.流插入流提取
istream& operator>>(istream& input, Data& d)
{
	while (1)
	{
		cout << "请依次输入年月日->:";
		input >> d._year >> d._month >> d._day;
		if (!(d.CheckDay()))
		{
			cout << "非法日期，请重新输入";
			cout << endl;
		}
		//合法输入跳出死循环
		break;
	}

	return input;
}

ostream& operator<<(ostream& output, const Data& d)
{
	cout << d._year << "/" << d._month << "/" << d._day << endl;
	return output;
}

bool Data::CheckDay()
{
	//判断日期是否非法
	if (_month > 12 || _month < 1 
		|| _day<1 || _day>GetMonthDay(_year, _month))
	{
		return false;
	}
	return true;
}